package com.atguigu.recursion;

/**
 * @author durant
 * @create 2021-11-13 11:44
 */
public class MiGong {
    public static void main(String[] args) {
        int[][] map =new int[8][7];
        // 使用1来表示墙，
        // 把上下置为1
        for (int i = 0; i < 7; i++) {
            map[0][i] = 1;
            map[7][i] = 1;

        }
        // 把左右置为1
        for (int i = 1; i <7 ; i++) {
            map[i][0] = 1;
            map[i][6] = 1;
        }
        map[3][1] = 1;
        map[3][2] = 1;
        show(map);
        System.out.println();
        setWay1(map,1,1);
        // 输出走过并标识过的地图
        show(map);
    }
    //使用递归回溯来给小球找路
    /*
    @Description
    * * @param map   是共享的地图
     * @param i  坐标
     * @param j 坐标
    *@Author Mr.Durant
    *@Date 2021/11/13
    *@Time 11:52
    */
    public static boolean setWay(int[][] map , int i, int j){
        // i,j 表示从地图的哪个位置出发
        // 结束点为 [6，5] 则说明通路找到
        // 约定 ，当map[i][j] 为0 时表示没走过，1时为不能走，2代表走过的路，3，表示该点走过了，但是走不通
        // 走迷宫的策略 下-》右 -》上->左
        if (map[6][5] == 2){
            return true;
        }else{// 如果不是2，会有好几种情况
            if (map[i][j] == 0){ // 当前这个点还没有走过
                // 走迷宫的策略 下->右->上->左
                map[i][j] = 2; // 假定这条路可以走通
                if (setWay(map, i+1, j)){//向下走
                    return true;
                }else if(setWay(map, i, j+1)){// 向右走
                    return true;
                } else if(setWay(map, i-1, j)){// 向上走
                    return true;
                }else if(setWay(map, i, j-1)){// 向右走
                    return true;
                }else{
                    // 说明该点是走不通的，是死路
                    map[i][j] = 3;
                    return false;
                }

            }else{// 如果map[i][j] != 0,可能是1，2，3，
                return  false;
            }

        }



    }
    // 修改策略

    public static boolean setWay1(int[][] map , int i, int j){
        // i,j 表示从地图的哪个位置出发
        // 结束点为 [6，5] 则说明通路找到
        // 约定 ，当map[i][j] 为0 时表示没走过，1时为不能走，2代表走过的路，3，表示该点走过了，但是走不通
        // 走迷宫的策略 上->右->下->左
        if (map[6][5] == 2){
            return true;
        }else{// 如果不是2，会有好几种情况
            if (map[i][j] == 0){ // 当前这个点还没有走过
                // 走迷宫的策略 上->右->下->左
                map[i][j] = 2; // 假定这条路可以走通
                if(setWay1(map, i-1, j)){// 向上走
                    return true;
                }else if(setWay1(map, i, j+1)){// 向右走
                    return true;
                } else  if (setWay1(map, i+1, j)){//向下走
                    return true;
                }else if(setWay1(map, i, j-1)){// 向右走
                    return true;
                }else{
                    // 说明该点是走不通的，是死路
                    map[i][j] = 3;
                    return false;
                }

            }else{// 如果map[i][j] != 0,可能是1，2，3，
                return  false;
            }

        }



    }
    //遍历地图
    static void show(int[][] map){
        for (int i = 0; i <8 ; i++) {
            for (int j = 0; j <7 ; j++) {
                System.out.print(map[i][j]+" ");
            }
            System.out.println();
        }
    }
}
